babl: make model_is_symmetric test adapt tolerance for high values
When the values used are in the billions, the tolerance that originally
was mostly intended for values in the range 0.0-1.0 and its neighborhood
break apart - use 1% of component values as symmetry threshold for such
values.
Elle Stone [Sat, 29 Jun 2019 16:45:34 +0000 (12:45 -0400)]
Add Yu'v' (CIE 1976 UCS) to babl CIE color spaces
Yu'v' is a linear transform of xyY that is more perceptually
uniform, and well-suited for eg creating chromaticity diagrams
that aren't misleading when comparing various RGB color spaces.
This color space has been recommended by many people as a better
choice than xyY. ACES documentation already uses this color space.
Øyvind Kolås [Thu, 13 Jun 2019 15:00:23 +0000 (17:00 +0200)]
babl: symmetric conversions between associated and separate alpha.
Provide symmetric, color data preserving conversions between associated and
separate alpha for alpha values near and equal to 0.0 at single precision
floating point. Thus these symmetric conversions also augment associated alpha
to always maintain color information.
This is achieved by clamping the alpha used when computing the color
components when multiplying/dividing components between separate and
associated alpha to BABL_ALPHA_FLOOR and -BABL_ALPHA_FLOOR for values
near 0.0, the alpha value is copied unmodified between pixels; the main
improvement of this commit.
In the implementation BABL_ALPHA_FLOOR is 1/65536 = 0.00001526.. small
enough that it vanishing in rounding for 16bit integer alpha but large
enough to retain color data.
The following table illustrates what corresponding values are between the
two alpha encodings supported. We here usea BABL_ALPHA_FLOOR of 0.01 instead
of 0.00001526 to make it easier to see what happens.
GEGL lets each operation compute with it's preferred encoding - for some
operations like blurs this is associated alpha, for others like color
adjustments it is separate alpha, perhaps even in CIE Lab based encodings
rather than RGB. An earlier iteration of this approach was already in use in
babl making un-erase mode and similar features in GIMP-2.10 work correctly
after blurring, the previous implementation did not preserve the
alpha value.
Just the core of the implementation follows:
```
#define BABL_ALPHA_FLOOR_F (1.0f/65536.0f)
static inline float
babl_epsilon_for_zero_float (float value)
{
if (value <= BABL_ALPHA_FLOOR_F)
{
/* for performance one could directly retun BABL_ALPHA_FLOOR_F here
and dropping handling negative values consistently. */
if (value >= 0.0f)
return BABL_ALPHA_FLOOR_F;
else if (value >= -BABL_ALPHA_FLOOR_F)
return -BABL_ALPHA_FLOOR_F;
}
return value; /* most common case, return input value */
}
Øyvind Kolås [Tue, 28 May 2019 23:58:30 +0000 (01:58 +0200)]
babl: implement babl_space_get_rgb_luminance
This provides the factors often found as defines hard-coded for sRGB
with values that are adapted to the primaries of the RGB family of
pixel encodings for a given babl space.
Øyvind Kolås [Thu, 6 Dec 2018 18:19:40 +0000 (19:19 +0100)]
babl: make babl_format_with_space not crash with palette based formats
Now, both palettes referred to by their string name and palettes passed
directly in with a cast get passed through without modification, for
correct behavior their palette entries should also be re-created
(the only way to read out the palette is currently to do an exhaustive buffer
conversion.)
Øyvind Kolås [Thu, 6 Dec 2018 16:06:28 +0000 (17:06 +0100)]
babl: special case palette formats in babl_format_with_space
For now, re-return the original passed in format, this will as
a starter not crash - while the color management is non-functional;
the special casing will be made more elaborate with space support
in babl-palette.
Øyvind Kolås [Thu, 6 Dec 2018 09:29:01 +0000 (10:29 +0100)]
tests: fix bit-rot in palette tests
Update to use R'G'B' u8 formats, which is what is now used internally
as well well, along with updating to use the current way of creating
formats with/without transparency.
Øyvind Kolås [Mon, 3 Dec 2018 23:18:47 +0000 (00:18 +0100)]
cairo: make mapping of cmyk subset easier
Make the mapping be RGB = CMK and RGB = CYK, only magenta and yellow
vary between them and the order remains the same, making it easier to
spot inconsitencies in code.
Øyvind Kolås [Mon, 3 Dec 2018 23:04:45 +0000 (00:04 +0100)]
cairo: move CMYK extension formats here
This adds new endian-aware formats cairo-ACMK32 and cairo-ACKY32 which are
derived from babl_format("camayakaA u8") - converting succesively with these
two formats to this format or other sharing the model permits rebuilding a
complete CMYKA image.
Øyvind Kolås [Mon, 3 Dec 2018 18:08:02 +0000 (19:08 +0100)]
babl: do not synthesize missing components
This permits copying to a complete format from a reduced set, only
setting the defined components. Earlier this could be achieved by
using a format with PAD for the components.